<?php
/**
 * zen_ventana_principal.php
 * @author Juan Belon
 * @access public
 * @copyright LGPL, GPL
 * @package zenphp_generador
 * @version 0.1.1
 * @uses zenphp FrameWork
 * @link http://csl2-zenphp.forja.rediris.es
 * @link http://www.zenphp.es
 * @link https://forja.rediris.es/projects/csl2-zenphp/
 * @see zen_analizador_cartucho
 * @see zen_gtk_ventana_mysql_admin
 * @magic Clase que crea la ventana principal usando la fábrica gtk.
 */
// +----------------------------------------------------------------------
// | zenphp.es
// +----------------------------------------------------------------------
define('ZF_GTK_MODO_DEBUG',false);
require_once("clases_gtk/zen_fabrica_gtk.php");
require_once("clases_gtk/zen_menu_gtk.php");
require_once("clases_gtk/zen_eventos_ventana_principal.php");
require_once("clases_gtk/zen_clases_arbol_gtk.php");
require_once("clases_gtk/zen_analizador_cartucho.php");
require_once("clases_gtk/zen_gtk_ventana_mysql_admin.php");
/**
* Clase para mostrar la ventana principal GTK del generador de aplicaciones
*/
class zen_ventana_principal extends GtkWindow
{
	/**
	* Variable para mostrar una previsualización del cartucho
	* @var str $img
	*/
	var $img = null;
	/**
	* Indica si carga la vista de previsualización del cartucho definida como una ruta a una imagen dentro del XML del cartucho... 
	* @var bool
	*/
	var $cargaVista = true;
	/**
	* El menú del programa
	* @var zen_menu_gtk
	*/
	var $menu = null ;
	/**
	* Los elementos del menú
	* @var array
	*/
	var $menus= array();
	/**
	* El objeto que contiene el conjunto de todos los componentes visuales del programa 
	* @var GtkVBox
	*/
	var $contenedor = null;
	/**
	* Las referencias a los objetos del programa como array
	* @var array
	*/
	var $widgets;
	/**
	* Clase que analiza los ficheros cartuchos XML
	* @var zen_analizador_cartucho
    	*/	
	var $analizador;
	/**
	* Especifica si añadir el motor zenphp al generar un proyecto de aplicación
	* @var bool
	*/
	var $incluir_zenphp = true;
	/**
	* Variable para saber si hemos cargado algún cartucho en memoria _con éxito_!
	* @var str
	*/
	var $cartucho_actual= "";
	/**
	 * Administrador de bases de datos mySQL
	 *
	 * @var zen_gtk_ventana_mysql_admin
	 */
	var $mysql_admin;
	/**
	* Es la clase que se encarga de fabricar los componentes de la ventana principal
	* @var zen_fabrica_gtk
	*/
	var $fabrica;
	/**
	* Todos los eventos que tienen que ver con la ventana principal van aqui
	* @var zen_eventos_ventana_principal
	*/
	var $eventos;
	/**
	* Constructor
	* @return zen_ventana_principal
	*/
	function zen_ventana_principal(){
		//Inicializaciones
		parent::__construct();
		$this->widgets = array();
		//Ahora podemos asociar la ventana al analizador
		$this->analizador =& new zen_analizador_cartucho($this);
		//Establecer el evento de salida
		$this->connect_simple('destroy', array('Gtk', 'main_quit'));
		//Colocar una caja para meter todos los componentes
		$this->contenedor =& new GtkVBox(false); //No homogéneo...
		//Ya podemos montar la fábrica de componentes:
		$this->fabrica =& zen_fabrica_gtk::obtenerFabrica($this);
		//Crear los menús...
		$this->fabrica->asociar_menus();
		//Y crear el navegador:
		$this->contenedor->add($this->fabrica->crear_navegador());
		//Por último añadir el contenedor principal a la ventana principal:
		$this->add($this->contenedor);		
		//Parámetros de la ventana principal:
		$this->set_title("Generador de aplicaciones de zenphp::".__CLASS__);
		$this->set_default_size(500, 400);
		$this->set_position(Gtk::WIN_POS_CENTER);
		//Mostrar todo:
		$this->show_all();
	}
	
	//+++++++++++++++++++++++++++++++++++
	//++++++ Funciones de usuario
	//+++++++++++++++++++++++++++++++++++
	/**
	* Muestra la información formateada del directorio seleccionado
	* @param GtkListStore $fichero_seleccionado
	* @param str $directorio
	*/
	function cargar_ficheros(&$fichero_seleccionado, $directorio){
		$manejador = dir($directorio);
		$fichero_seleccionado->clear();

		while (false !== ($fichero = $manejador->read())) {
			if ($fichero==".") continue;
			$obj_imagen = null;
			$ruta = $manejador->path . DIRECTORY_SEPARATOR . $fichero;
			if (is_dir($ruta) && $fichero !== '.') {
				$this->poner_imagen_icono($obj_imagen,'img/directorio.jpg');
				$fichero_seleccionado->append(array($fichero, '<span color="#00F">' . $fichero . '</span>', $ruta, true, $obj_imagen));
				continue;
			} elseif (substr($ruta, -4) == '.xml') {
				if ($this->cargaVista){ //Precarga del fichero...etc
				 $r = $this->analizador->lee_previsualizacion_del_cartucho($ruta,$obj_imagen); //Carga la previsualización del XML del cartucho
				}
				if (!$r || $obj_imagen==null) $this->poner_imagen_icono($obj_imagen,'img/xml.gif');
			} else {
				$this->poner_imagen_icono($obj_imagen,'img/fichero.png');
			}
			$fichero_seleccionado->append(array($fichero, $fichero, $ruta, false, $obj_imagen));
		}
	}
	/**
	 * Pone la $imagen dada como icono al elemento de la lista de ficheros $pb
	 *
	 * @param GdkPixbuf $pb
	 * @param str $imagen
	 */
	function poner_imagen_icono( &$pb, $imagen='img/fichero.png' ){
		$pb = GdkPixbuf::new_from_file($imagen)->scale_simple(32, 32, Gdk::INTERP_BILINEAR);
	}
	
	/**
	 * Pone la $imagen al $this->widgets['imagen'] (GtkImage) del viewport del primer panel del GtkNotebook (ver kksou PHP-GTK Explorer)
	 * @param str $imagen
	 */
	function poner_imagen($imagen=""){
		if (ZF_GTK_MODO_DEBUG)
		 print_r(array_keys($this->widgets));
		if (empty($imagen)||!is_readable($imagen)) {
			trigger_error("No se puede leer la imagen $imagen",E_USER_WARNING);
		} else {
			//GtkImage:
			$this->widgets['imagen']->set_from_file($imagen);
		}
	}
	
	/**
	* Función para añadir la base de datos leida desde el XML al árbol de base de datos de la interfaz
        * @todo Cambiar GtkClist por un GtkTreeView porque va a desaparecer de GTK2...
	* @param array $datos
	*/
	function anadir_bd(&$datos){
		$imagen = /*dirname( __FILE__).DIRECTORY_SEPARATOR.*/"..".DIRECTORY_SEPARATOR.
                    "..".DIRECTORY_SEPARATOR."contenido".DIRECTORY_SEPARATOR.
                    "img".DIRECTORY_SEPARATOR."bd_tuerca.png";
		//$imagen = "img/bd_tuerca.xpm";
		if (!is_readable($imagen)) {
			printf("no existe la imagen %s",$imagen);
			$imagen = null;
		}
		$clist =& $this->widgets['arbol_propiedades_basedatos'];  
		/** TODO: deprecated en el constructor! :*/
		@$col = $clist->append(array("",$datos['servidor'],$datos['usuario'],$datos['contrasena'], $datos['nombre'],$datos['tipo']));
		//En la última fila ponemos el icono
		if ($imagen!=null){
		 $pixbuf = GdkPixbuf::new_from_file($imagen); //->scale_simple(, 32, Gdk::INTERP_BILINEAR);
		 list($pixmap, $mask) = $pixbuf-> render_pixmap_and_mask(1);
		 $clist-> set_pixmap($clist->rows-1,0,$pixmap,$mask);
		}
		//$clist->set_pixmap($clist->rows, 0, GdkPixmap::create_from_xpm($d,32,32,$imagen));
		$clist->show_all();
	}
}
?>